import json
from typing import Dict

"""
定义好的异常信息类以及一些常用的自定义异常，便于返回错误信息以及与日志系统结合

class:
    Status: 异常类
"""


class Status:
    """
    异常信息类以及一些常用的操作
    说实话，我不知道这里为什么要进行封装，因为代码现在还比较简单所以暂时不改了
    （话说屎山是不是就是这么积累起来的？）

    field:
        _code: str -> 异常码
        _message: str -> 异常信息

    method:
        code: 返回/更改状态码_code
        message: 返回/更改信息_message
    """
    _code: str = ""
    _message: str = ""

    def __init__(self, code, message):
        self._code = code
        self._message = message

    @property
    def code(self) -> str:
        return self._code

    @code.setter
    def code(self, value):
        if not isinstance(value, str):
            raise TypeError("Property code should be type 'str'.")
        self._code = value

    @property
    def message(self) -> str:
        return self._message

    @message.setter
    def message(self, value):
        if not isinstance(value, str):
            raise TypeError("Property code should be type 'str'.")
        self._code = value

    def json(self, indent=2) -> str:
        """
        返回Status对象用json表示的字符串

        :param indent: json字符串的缩进空格数，默认值为2
        :return: 生成的json字符串
        """
        return json.dumps(self.dict(), indent=indent)

    def dict(self) -> Dict[str, str]:
        """
        返回对象的字典，字典的键去掉最前面的下划线

        :return: {"code": self.code, "message": self.message}
        """
        return {
            "code": self.code,
            "message": self.message
        }


"""
这里预定义一些常用的状态码，便于程序使用。
00000，表示程序按照预期完成，没有任何异常；
A开头表示因用户请求出错，程序无法按照预期完成；
B开头表示因为外部原因导致程序发生错误。
"""

ok = Status(code="00000", message="一切Ok")
client_error = Status(code="A0001", message="用户端错误")
parameter_missing = Status(code="A0101", message="请求参数不完整")
runtime_error = Status(code="B0001", message="系统执行出错")
path_not_exist = Status(code="B0002", message="目标路径不存在")
directory_incomplete = Status(code="B0003", message="目标文件夹结构不完整")
code_not_found = Status(code="B0004", message="代码文件缺失")
permission_error = Status(code="B0005", message="文件权限不足")
